// Promise对象有以下两个特点。
// （1）对象的状态不受外界影响。Promise对象代表一个异步操作，有三种状态：pending（进行中）、fulfilled（已成功）和rejected（已失败）。只有异步操作的结果，可以决定当前是哪一种状态，任何其他操作都无法改变这个状态。这也是Promise这个名字的由来，它的英语意思就是“承诺”，表示其他手段无法改变。
// （2）一旦状态改变，就不会再变，任何时候都可以得到这个结果。Promise对象的状态改变，只有两种可能：从pending变为fulfilled和从pending变为rejected。只要这两种情况发生，状态就凝固了，不会再变了，会一直保持这个结果，这时就称为 resolved（已定型）。如果改变已经发生了，你再对Promise对象添加回调函数，也会立即得到这个结果。这与事件（Event）完全不同，事件的特点是，如果你错过了它，再去监听，是得不到结果的。

// promise的resolve用法进行了解释，相当于resolve是对promise成功时候的回调，它把promise的状态修改为
// function a() {
//     let p = new Promise(function (resolve, reject) {
//         setTimeout(() => {
//             // console.log(55555)
//             resolve('已经执行完毕')
//         }, 2000)
//     }).then((data) => {
//         // console.log(data)
//     })
//     return p
// }

// a()



// reject就是失败的时候的回调，他把promise的状态修改为rejected，这样我们在then中就能捕捉到，然后执行“失败”情况的回调。

// function promiseClick() {
//     let p = new Promise(function (resolve, reject) {
//         setTimeout(function () {
//             var num = Math.ceil(Math.random() * 20); //生成1-10的随机数
//             console.log('随机数生成的值：', num)
//             if (num <= 10) {
//                 resolve(num);
//             }
//             else {
//                 reject('数字太于10了即将执行失败回调');
//             }
//         }, 2000);
//     })
//     return p
// }

// promiseClick().then(
//     function (data) {
//         console.log('resolved成功回调');
//         console.log('成功回调接受的值：', data);
//     },
//     function (reason, data) {
//         console.log('rejected失败回调');
//         console.log('失败执行回调抛出失败原因：', reason);
//     }
// );



// catch的用法  与Promise对象方法then方法并行的一个方法就是catch,与try  catch类似，catch就是用来捕获异常的，也就是和then方法中接受的第二参数rejected的回调是一样的
// function promiseClick(){
//     let p = new Promise(function(resolve, reject){
//         setTimeout(function(){
//             var num = Math.ceil(Math.random()*20); //生成1-10的随机数
//             console.log('随机数生成的值：',num)
//             if(num<=10){
//                 resolve(num);
//             }
//             else{
//                 reject('数字太于10了即将执行失败回调');
//             }
//         }, 2000);
//        })
//        return p
//    }

// promiseClick().then(
//     function(data){
//         console.log('resolved成功回调');
//         console.log('成功回调接受的值：',data);
//     }
// )
// .catch(function(reason, data){
//     console.log('catch到rejected失败回调');
//     console.log('catch失败执行回调抛出失败原因：',reason);
// });


// all的用法 与then同级的另一个方法，all方法，该方法提供了并行执行异步操作的能力，并且在所有异步操作执行完后并且执行结果都是成功的时候才执行回调。
function promiseClick1(){
    let p = new Promise(function(resolve, reject){
        setTimeout(function(){
            var num = Math.ceil(Math.random()*20); //生成1-10的随机数
            console.log('随机数生成的值1：',num)
            if(num<=10){
                resolve(num);
            }
            else{
                reject('数字太于10了即将执行失败回调');
            }
        }, 2000);
       })
       return p
   }
   function promiseClick2(){
    let p = new Promise(function(resolve, reject){
        setTimeout(function(){
            var num = Math.ceil(Math.random()*20); //生成1-10的随机数
            console.log('随机数生成的值2：',num)
            if(num<=10){
                resolve(num);
            }
            else{
                reject('数字太于10了即将执行失败回调');
            }
        }, 2000);
       })
       return p
   }
   function promiseClick3(){
    let p = new Promise(function(resolve, reject){
        setTimeout(function(){
            var num = Math.ceil(Math.random()*20); //生成1-10的随机数
            console.log('随机数生成的值3：',num)
            if(num<=10){
                resolve(num);
            }
            else{
                reject('数字太于10了即将执行失败回调');
            }
        }, 2000);
       })
       return p
   }

Promise
    .all([promiseClick3(), promiseClick2(), promiseClick1()])
    .then(function(results){
        console.log(results);
    })
    .catch(function(results,data){
        console.log('resultscatch',results)
        console.log('datacatch',data)
    })
